package com.nightsoul.java8.test.extannotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.Collection;

public class Annotations {

	@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
	@Retention(RetentionPolicy.RUNTIME)
	public @interface NotEmpty {

	}

	public static class Holder<@NotEmpty T> extends @NotEmpty Object {

		public void method() throws @NotEmpty Exception {

		}
	}

	/**
	 * ElementType.TYPE_USE和ElementType.TYPE_PARAMETER是两个新添加的用于描述适当的注解上下文的元素类型。
	 * 在Java语言中，注解处理API也有小的改动来识别新增的类型注解。
	 * @param args
	 */
	public static void main(String[] args) {
		final Holder<String> holder = new @NotEmpty Holder<>();
		@NotEmpty Collection<@NotEmpty String> strings = new ArrayList<>();

		System.out.println(holder);
		System.out.println(strings);
	}
}
